// 1.使用共享内存实现进程间通信， 理解共享内存原理， 考察shmget, shmat, shmdt， shmctl函数的使用， 理解共享内存的生命周期
// 2.要求：使用代码创建一个共享内存， 支持两个进程进行通信
//  进程A 向共享内存当中写 “i am process A”
//  进程B 从共享内存当中读出内容，并且打印到标准输出

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>

#define PATH_NAME "."
#define PROJ_ID 'A'

int main()
{
    // 先使用ftok生成一个唯一的key值
    key_t key = ftok(PATH_NAME, PROJ_ID);
    // a进程向共享内存中写
    // 创建共享内存
    int shmid = shmget(key, 4096, IPC_CREAT | IPC_EXCL | 0666);
    // 连接共享内存
    char *addr = shmat(shmid, NULL, 0);
    // 往里面写

    // 断开，这里不需要传入id，因为对于当前进程来说，一旦前面绑定过共享内存，addr足以区分其他共享内存
    strcpy(addr, "i am process A");
    shmdt(addr);

    // 休眠一下，避免b还没连接就找不到了
    sleep(10);

    shmctl(shmid, IPC_RMID, NULL);

    return 0;
}
